﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace UsbGuard.Administration
{
    public partial class frmLehrer : Form
    {
        UsbGuard.Core.Intelligence mainInt;
        public frmLehrer()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            mainInt = new UsbGuard.Core.Intelligence(null, Application.StartupPath ,true);
            mainInt.NewStickRecognized += new EventHandler(mainInt_NewStickRecognized);
            mainInt.Start();
            toolTip1.SetToolTip(this.btnRefresh, "Aktualisieren"); // Dem Refresh Button das Tooltip zuweisen
            Form2 f = new Form2(); // Zunächst Passwortabfrage aktivieren
            System.Windows.Forms.DialogResult result = f.ShowDialog();
            //Prüfen, ob Passwort korrekt eingegeben wurde
            while (result != System.Windows.Forms.DialogResult.OK && result != System.Windows.Forms.DialogResult.Abort) result = f.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.Abort) 
                this.Close();

            legendgreen.BackColor = Color.LightGreen; //Legendenfelder einfärben
            legendOrange.BackColor = Color.Orange; //Legendenfelder einfärben
         }

        /// <summary>
        /// Ruft die Methode Refreshlists auf, sofern ein neuer USB-Stick erkannt wurde
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void mainInt_NewStickRecognized(object sender, EventArgs e)
        {
            // Wenn wir uns nicht im selben Thread befinden - über Invoke aufrufen
            if (InvokeRequired)
            {
                Invoke(new mainInt_NewStickRecognized_delegate(mainInt_NewStickRecognized),new object[]{sender, e});
            }
            else
            {
                refreshlists();
            }
        }
        
        delegate void mainInt_NewStickRecognized_delegate(object sender, EventArgs e); 

        /// <summary>
        /// Erfragt die angesteckten USB-Sticks aus dem Core und legt für jeden angesteckten USB-Stick ein ListViewItem in der ListView listActive an.
        /// </summary>
        private void activeSticks_get()
        {
            
                foreach (UsbGuard.Core.USBDeviceInfo deviceInfo in mainInt.ConnectedUSBDevices)
                {
                    ListViewItem lviactive = new ListViewItem(new String[] { "-", deviceInfo.PnpDeviceID, (string)deviceInfo.GetDriveInfo("Caption") });
                    
                    // Überprüfen ob ein Element in der Liste der registrierten USB-Sticks vorhanden ist.
                    if (listRegistered.Items.Count >= 1)
                    {
                        //Schleife durchlaufen, in der jedes aktive Element mit den registrierten Sticks überprüft wird
                        for (int i = 0; i < listRegistered.Items.Count; i++)
                        {
                            //Vergleich mit dem in der Datenbank hinterlegten MD5Hash.
                            if (UsbGuard.Core.Intelligence.getMD5Hash(deviceInfo.PnpDeviceID, 3) == listRegistered.Items[i].SubItems[4].Text)
                            {
                                lviactive.SubItems[0].Text = listRegistered.Items[i].SubItems[0].Text;
                                //Bezeichner aus dem ListViewItem der ListView listRegistered übernehmen
                                lviactive.SubItems[2].Text = listRegistered.Items[i].SubItems[2].Text;
                                //Anlegen eines neuen Unteritems und übernehmen des Registrationsdatums
                                lviactive.SubItems.Add(listRegistered.Items[i].SubItems[3].Text);

                                //Überprüfung ob das Masterflag auf X gesetzt ist um die Färbung zu bestimmen
                                if (listRegistered.Items[i].SubItems[1].Text == "X")
                                {
                                    lviactive.BackColor = Color.Orange;
                                }
                                else
                                {
                                    lviactive.BackColor = Color.LightGreen;
                                }

                            }
                        }

                    }
                    listActive.Items.Add(lviactive); //Fügt das ListviewItem lviactive der Listview listActive hinzu
                }
            
        }

        /// <summary>
        /// Erfragt die in der Datenbank hinterlegten USB-Sticks aus dem Core und erstellt für jeden Stick ein ListViewElement in der ListView listRegistered
        /// </summary>
        private void registeredSticks_get()
        {
            foreach (UsbGuard.RegisteredSticks regStick in mainInt.RegisteredSticks) //Fragt die Daten jedes Sticks ab
            {
                string masterstick = "";
                if (regStick.IsMasterStick == true)
                {
                    masterstick = "X"; //Setzt ein X in die Variable masterstick, falls der Stick ein Masterstick ist
                }
                else
                {
                    masterstick = "";
                }
                listRegistered.Items.Add(new ListViewItem(new String[] { regStick.ID.ToString(), masterstick, regStick.Description, regStick.RegisterDate, regStick.VendorID})); //Fügt einen registrierten Stick der Liste der registrierten Sticks zu
            
            }
        }

        /// <summary>
        /// Methode für Buttonklick Registrieren
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRegister_Click(object sender, EventArgs e)
        {
            try
            {
                if (listActive.SelectedIndices.Count >= 1) //Überprüfung ob ein USB-Stick aus der Liste für angesteckte Sticks ausgewählt ist
                {

                    tbBezstick.Text = tbBezstick.Text.Trim(); //Entfernt sämtliche Leerzeichen vor dem Inhalt des Textfeldes Bezeichnung

                    if (tbBezstick.Text == "") //Überprüfen ob Textfeld Bezeichnung des USB-Sticks gefüllt ist.
                    {
                        MessageBox.Show("Bitten geben Sie einen gültigen Bezeichner ein.");
                    }
                    else
                    {
                       
                            mainInt.RegisterUsbStick(listActive.Items[listActive.SelectedIndices[0]].SubItems[1].Text, tbBezstick.Text, chkMasterStick.Checked); //Legt einen neuen Stick in der Datenbank an
                            chkMasterStick.Checked = false; //Setzt die Checkbox wieder auf false                  
                        
                        refreshlists(); //Löscht und aktualisiert beide Listen
                        tbBezstick.Text = ""; //Leert das Textfeld Bezeichnung
              
                    }


                }
                else
                {
                    MessageBox.Show("Sie müssen einen angesteckten USB-Stick auswählen.");
                }
                
                
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        /// <summary>
        /// Löscht und aktualisiert beide Listen
        /// </summary>
        private void refreshlists()
        {
            listRegistered.Items.Clear(); //Löscht die gesamte Liste mit den registrierten Sticks
            registeredSticks_get(); //Befüllt die Liste der registrierten Sticks
            listActive.Items.Clear(); //Löscht die gesamte Liste mit den angesteckten Sticks
            activeSticks_get(); //Befüllt die Liste mit den angesteckten Sticks
        }

        /// <summary>
        /// Methode für den Refresh Button
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            listActive.Items.Clear(); //Löscht alle Datensätze aus der Liste der angesteckten Sticks
            activeSticks_get(); //Befüllt die Liste mit den angesteckten Sticks
        }

        /// <summary>
        /// Methode für den Löschen Button
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                if (listRegistered.SelectedIndices.Count >= 1)  //Überprüft, ob ein registrierter Stick aus der Liste ausgewählt wurde
                {
                    mainInt.DeregisterUsbStick(Convert.ToInt32(listRegistered.Items[listRegistered.SelectedIndices[0]].SubItems[0].Text)); //Deregistriert den Stick
                    refreshlists(); //Löscht und aktualisiert beide Listen
                }
                else
                {
                    MessageBox.Show("Sie müssen einen registrierten USB-Stick auswählen.");
                }
            }
            catch
            {

            }
        }

        /// <summary>
        /// Methode für FormClose, hierbei sollen alle Threads gestoppt werden, welche mit dem Abhören der USB-Sticks betraut sind.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmLehrer_FormClosed(object sender, FormClosedEventArgs e)
        {
            mainInt.Stop(); //Stoppt alle Threads, die für das Abhören der USB-Sticks verantwortlich sind
        }
    }
}
